/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gcs.Dados;

import gcs.Negocio.Actividade;
import gcs.Negocio.Cliente;
import gcs.Negocio.Empresa;
import gcs.Negocio.Servico;
import gcs.Negocio.TipoServico;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Pedro
 */
public class EmpresasBD {
    Connection con;
    ConnDB c;

    public EmpresasBD(){
        con = new ConnDB().Connect();

        //colocar os valores static correctos
        try{
            //empresas
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT COUNT(cod_empresa) FROM Empresas");
            while (rs.next()){
                Empresa.setContador(rs.getInt(1));
            }
            //Servicos
            st = con.createStatement();
            rs = st.executeQuery("SELECT COUNT(cod_servico) FROM Servicos");
            while (rs.next()){
                Servico.setContador(rs.getInt(1));
            }
            //Actividades
            st = con.createStatement();
            rs = st.executeQuery("SELECT COUNT(cod_actividade) FROM Actividades");
            while (rs.next()){
                Actividade.setContador(rs.getInt(1));
            }
            //Tipos de Servico
            st = con.createStatement();
            rs = st.executeQuery("SELECT COUNT(cod_ts) FROM TipoServico");
            while (rs.next()){
            TipoServico.setContador(rs.getInt(1));
            }
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


    //LER
    //ler da BD a lista de empresas
    public TreeMap<String,Empresa> getListaEmp(){
        TreeMap<String,Empresa> le = new TreeMap<String,Empresa>();
        Statement st;
        try {
            st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM Empresas");
            while (rs.next()){
                Empresa e= new Empresa(true);
                e.setCodEmp(rs.getString(1));
                e.setNome(rs.getString(2));
                e.setDes(rs.getString(3));
                e.setTipo(rs.getInt(4));
                e.setActivo(rs.getBoolean(5));

                TreeMap<String,Servico> ls = new TreeMap<String,Servico>(getListaServicos(e.getCodEmp()));
                e.setServicos(ls);
                le.put(rs.getString(1),e);
                }
            }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return le;
    }
    //ler da BD a lista de servicos de uma empresa
    public TreeMap<String,Servico> getListaServicos(String codE){
        TreeMap<String,Servico> ls = new TreeMap<String,Servico>();
        try{
            Statement  st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM Servicos WHERE cod_e='"+codE+"'");
            while (rs.next()){
                Servico s = new Servico(true);
                s.setcodServ(rs.getString(1));
                s.setNome(rs.getString(2));
                s.setDes(rs.getString(3));
                s.setActivo(rs.getBoolean(4));
                TreeMap<String,Actividade> la = new TreeMap<String,Actividade>(getListaActividades(s.getcodServ()));

                s.setActividades(la);
                ls.put(s.getcodServ(), s);
            }
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }

        return ls;
    }
    //ler da BD uma lista de actividades de um servico
    public TreeMap<String,Actividade>getListaActividades(String codS){
        TreeMap<String,Actividade> la = new TreeMap<String,Actividade>();
        try{
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM Actividades WHERE cod_s='"+codS+"'");
            while (rs.next()){
                Actividade a = new Actividade(true);
                a.setcodAct(rs.getString(1));
                a.setNome(rs.getString(2));
                a.setDes(rs.getString(3));
                a.setPreco(rs.getFloat(4));
                a.setActivo(rs.getBoolean(5));

                la.put(a.getcodAct(), a);
            }
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return la;
    }
     //ler da BD os tipos de servico
    public TreeMap<Integer,TipoServico> getListaTiposServ(){
        TreeMap<Integer,TipoServico>lt=new TreeMap<Integer, TipoServico>();
        try{
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM TipoServico");
            while (rs.next()){
                TipoServico ts = new TipoServico(true);
                ts.setCod(rs.getInt(1));
                ts.setTipo(rs.getString(2));
                lt.put(ts.getCod(),ts);
            }
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lt;
    }

    public TipoServico getTipoServ(String cod){
        TipoServico ts = new TipoServico(true);
        try{
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM TipoServico ");
            while (rs.next()){
                ts.setCod(rs.getInt(1));
                ts.setTipo(rs.getString(2));
            }
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ts;
    }




    //ESCREVER
    //guardar uma empresa
    public void guardaEmpresa(Empresa e){
        try{
            Statement st = con.createStatement();

            String cod = e.getCodEmp();
            String nome = e.getNome();
            String desc = e.getDesc();
            int tipo = e.getTipo();
            boolean activo = e.getActivo();
            st.executeUpdate("INSERT INTO Empresas " +
            "VALUES ('"+cod+"','"+nome+"','"+desc+"','"+tipo+"',"+activo+")");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //guardar servico
    public void guardaServico(String codEmp,Servico s){
        try{
            Statement st = con.createStatement();

            String cod = s.getcodServ();
            String nome = s.getNome();
            String desc = s.getDesc();
            boolean activo = s.getActivo();

            st.executeUpdate("INSERT INTO Servicos " +
            "VALUES ('"+cod+"','"+nome+"','"+desc+"',"+activo+",'"+codEmp+"')");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //guardar actividade
    public void guardaActividade(String codServico,Actividade a){
    try{
            Statement st = con.createStatement();

            String cod = a.getcodAct();
            String nome = a.getNome();
            String desc = a.getDesc();
            float preco = a.getPreco();
            boolean activo = a.getActivo();
            
            st.executeUpdate("INSERT INTO Actividades " +
            "VALUES ('"+cod+"','"+nome+"','"+desc+"','"+preco+"',"+activo+",'"+codServico+"')");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

     //guardar na bd, um novo tipo de servico
    public void guardaTiposServ(TipoServico ts){
        try{
            Statement st = con.createStatement();

            st.executeUpdate("INSERT INTO TipoServico " +
            "VALUES ('"+ts.getCod()+"','"+ts.getTipo()+"')");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //UDATES
    //update de uma empresa
    public void updateEmpresa(Empresa e){
        try{
            Statement st = con.createStatement();

            String cod = e.getCodEmp();
            String nome = e.getNome();
            String desc = e.getDesc();
            int tipo = e.getTipo();
            boolean activo = e.getActivo();
            st.executeUpdate("UPDATE Empresas SET "+
                    "cod_empresa='"+cod+"',"+
                    "nome='"+nome+"',"+
                    "descricao='"+desc+"',"+
                    "tipo='"+tipo+"',"+
                    "activo="+activo+" WHERE cod_empresa ='"+cod+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //update de um servico
    public void updateServico(String codEmp,Servico s){
        try{
            Statement st = con.createStatement();

            String cod = s.getcodServ();
            String nome = s.getNome();
            String desc = s.getDesc();
            boolean activo = s.getActivo();
            st.executeUpdate("UPDATE Servicos SET "+
                    "cod_servico='"+cod+"',"+
                    "nome='"+nome+"',"+
                    "descricao='"+desc+"',"+
                    "activo="+activo+","+
                    "cod_e='"+codEmp+"' WHERE cod_servico ='"+cod+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //update de uma actividade
    public void updateActividade(String codServ,Actividade a){
        try{
            Statement st = con.createStatement();

            String cod = a.getcodAct();
            String nome = a.getNome();
            String desc = a.getDesc();
            float preco = a.getPreco();
            boolean activo = a.getActivo();
            st.executeUpdate("UPDATE Actividades SET "+
                    "cod_actividade='"+cod+"',"+
                    "nome='"+nome+"',"+
                    "descricao='"+desc+"',"+
                    "preco='"+preco+"',"+
                    "activo="+activo+","+
                    "cod_s='"+codServ+"' WHERE cod_actividade ='"+cod+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //update de um tipo de servico
    public void updateTipoServico(TipoServico ts){
        try{
            Statement st = con.createStatement();

            st.executeUpdate("UPDATE TipoServico SET "+
                    "cod_ts='"+ts.getCod()+"',"+
                    "tipo='"+ts.getTipo()+"' WHERE cod_ts ='"+ts.getCod()+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //update de um cliente
    public void updateCliente(Cliente c){
        try{
            Statement st = con.createStatement();

            String cod = c.getCodCliente();
            String nome = c.getNome();
            int bi = c.getNumBI();
            int cont = c.getNumContribuinte();
            String morada = c.getMorada();
            boolean activo = c.isActivo();
            st.executeUpdate("UPDATE Clientes SET "+
                    "cod_cliente='"+cod+"',"+
                    "nome='"+nome+"',"+
                    "numBI='"+bi+"',"+
                    "numContrib='"+cont+"',"+
                    "morada='"+morada+"',"+
                    "activo="+activo+" WHERE cod_cliente ='"+cod+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //alterar estado empresa
    public void updateEstadoEmp(String codEmp, boolean estado){
        try{
        Statement st = con.createStatement();
        st.executeUpdate("UPDATE Empresas SET "+
                    "activo="+estado+" WHERE cod_empresa ='"+codEmp+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //alterar estado servico
    public void updateEstadoServ(String codServ, boolean estado){
        try{
        Statement st = con.createStatement();
        st.executeUpdate("UPDATE Servicos SET "+
                    "activo="+estado+" WHERE cod_servico ='"+codServ+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //alterar estado empresa
    public void updateEstadoAct(String codAct, boolean estado){
        try{
        Statement st = con.createStatement();
        st.executeUpdate("UPDATE Actividades SET "+
                    "activo="+estado+" WHERE cod_actividade ='"+codAct+"'");
        }
        catch (SQLException ex) {
            Logger.getLogger(EmpresasBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}
